package com.company;

import java.io.File;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class ReflectDemo02 {
    public static void main(String[] args) {
        // 第一步：获取 对应的字节码文件对象
        try {
            // 获取 Person 的Class对象
            Class personClass = Class.forName("com.company.Person");



//  ----------------------------   获取 所有public 修饰的成员变量们，返回 Filed 类型的数组对象  -------------------------------------------------------
            // Filed[] getFields()： 获取 所有public 修饰的成员变量们
            Field[] personFiledarr = personClass.getFields();  // 返回 Field类型 的数组
//
            for ( Field personFiled: personFiledarr
                 ) {
                System.out.println("personFiled" + personFiled + '\n');
            }



//  ----------------------------   获取 指定的 public 修饰的成员变量，返回 Field 类型的对象  -------------------------------------------------------
            // Filed[] getFields()： 获取 指定的 public 修饰的成员变量
            Field personFiled = personClass.getField("booknum");  // 运行正常 ，返回 Field 类型

//            Field personFiled = personClass.getField("booknum1");  // 类中没有指定的 booknum1 属性 ，报异常NoSuchFieldException
            // 类中没有指定的 属性则会出现异常 ： NoSuchFieldException
            System.out.println(personFiled);





//  ----------------------------   获取 指定的成员变量【不考虑修饰符，返回 Filed 类型的对象】  -------------------------------------------------------
            // Filed getDeclaredFileds(String name)  获取指定的 成员变量【不考虑修饰符】
            Field variableName1 = personClass.getDeclaredField("name1");
            Field variableName2 = personClass.getDeclaredField("name2");
            Field variableName3 = personClass.getDeclaredField("name3");
            Field variableName4 = personClass.getDeclaredField("name4");

            System.out.println(variableName1);
            System.out.println(variableName2);
            System.out.println(variableName3);
            System.out.println(variableName4);
            /*
                public java.lang.String com.company.Person.name1
                java.lang.String com.company.Person.name2
                protected java.lang.String com.company.Person.name3
                private java.lang.String com.company.Person.name4
            *
            * */





//  ----------------------------   获取 所有的成员变量【不考虑修饰符，返回 Filed 类型的数组对象】  -------------------------------------------------------
            Field[] personDelcrearr = personClass.getDeclaredFields();

            for( Field personDecalerFiled: personDelcrearr){
                System.out.println(personDecalerFiled);
                /*
                *   public java.lang.String com.company.Person.name1
                    java.lang.String com.company.Person.name2
                    protected java.lang.String com.company.Person.name3
                    private java.lang.String com.company.Person.name4
                    private int com.company.Person.age
                    public int com.company.Person.booknum

                * */
            }

        } catch (ClassNotFoundException | NoSuchFieldException exception) {
            exception.printStackTrace();
        }

    }
}
